package fr.miage.orleans.aar.peupler;

import fr.miage.orleans.aar.ejb.peupler.FacadePeuplerBean;
import fr.miage.orleans.aar.modele.utils.Peupler;
import java.io.IOException;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *
 * @author Steve Cancès <steve.cances@gmail.com>
 */
@WebServlet(name = "PeuplerServlet", urlPatterns = {"/peupler"})
public class PeuplerServlet extends HttpServlet {

    /**
     * Les strings
     */
    public static final String STRING_ACTION = "action";

    /**
     * Les actions
     */
    public static final String ACTION_CREER_TOURNOI_EN_PREPARATION = "creerTournoiEnPreparation";
    public static final String ACTION_CREER_TOURNOI_EN_COURS = "creerTournoiEnCours";
    public static final String ACTION_CREER_TOURNOI_EN_COURS_TIR_AU_BUT = "creerTournoiEnCoursTirAuBut";
    public static final String ACTION_CREER_TOURNOI_TERMINE = "creerTournoiTermine";
    public static final String ACTION_RAZBDD = "razbdd";

    /**
     * Les JSPs
     */
    private static final String JSP_PEUPLER = "/WEB-INF/peupler.jsp";

    /**
     * Les attributs de session
     */
    public static final String SA_ERROR = "error";
    public static final String SA_SUCCESS = "success";

    /**
     * Les parametres
     */
    public static final String PARAM_NB_EQUIPES = "nbEquipes";

    @EJB
    private FacadePeuplerBean facadePeupler;

    public boolean nombreEquipesPuissanceDe2(int nbEquipes) {
	if (nbEquipes <= 1) {
	    return false;
	}
	return Integer.bitCount(nbEquipes) == 1;
    }

    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
     * methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
	    throws ServletException, IOException {
	response.setContentType("text/html;charset=UTF-8");
	String action = request.getParameter(STRING_ACTION);
	if (action == null || action.isEmpty()) {
	    this.processIndex(request, response);
	} else {
	    switch (action) {
		case ACTION_RAZBDD: {
		    this.processRazBdd(request, response);
		    break;
		}
		case ACTION_CREER_TOURNOI_EN_PREPARATION: {
		    this.processCreerTournoiEnPreparation(request, response);
		    break;
		}
		case ACTION_CREER_TOURNOI_EN_COURS: {
		    this.processCreerTournoiEnCours(request, response);
		    break;
		}
		case ACTION_CREER_TOURNOI_EN_COURS_TIR_AU_BUT: {
		    this.processCreerTournoiEnCoursTirAuBut(request, response);
		    break;
		}
		case ACTION_CREER_TOURNOI_TERMINE: {
		    this.processCreerTournoiTermine(request, response);
		    break;
		}
		default: {
		    this.processIndex(request, response);
		}
	    }
	}
    }

    protected void processIndex(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	request.getRequestDispatcher(JSP_PEUPLER).forward(request, response);
    }

    protected void processRazBdd(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	HttpSession session = request.getSession(true);
	this.facadePeupler.razBdd();
	session.setAttribute(SA_SUCCESS, "La base de données a été dépeuplée");
	this.processIndex(request, response);
    }

    protected void processCreerTournoiEnPreparation(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	HttpSession session = request.getSession(true);
	String paramNbEquipes = (String) request.getParameter(PARAM_NB_EQUIPES);
	if (paramNbEquipes != null && paramNbEquipes.length() > 0) {
	    try {
		int nbEquipes = Integer.valueOf(paramNbEquipes);
		Peupler.creerTournoi(this.facadePeupler, nbEquipes);
		session.setAttribute(SA_SUCCESS, "Tournoi en préparation créé");
	    } catch (NumberFormatException exception) {
		session.setAttribute(SA_ERROR, "Nombre d'équipes incorrect");
		this.processIndex(request, response);
	    }
	}
	this.processIndex(request, response);
    }

    protected void processCreerTournoiEnCours(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	HttpSession session = request.getSession(true);
	String paramNbEquipes = (String) request.getParameter(PARAM_NB_EQUIPES);
	if (paramNbEquipes != null && paramNbEquipes.length() > 0) {
	    try {
		int nbEquipes = Integer.valueOf(paramNbEquipes);
		if (this.nombreEquipesPuissanceDe2(nbEquipes)) {
		    Peupler.creerTournoiEnCours(this.facadePeupler, nbEquipes);
		    session.setAttribute(SA_SUCCESS, "Tournoi en cours créé");
		} else {
		    session.setAttribute(SA_ERROR, "Le nombre d'équipes doit être une puissance de deux");
		}
	    } catch (NumberFormatException exception) {
		session.setAttribute(SA_ERROR, "Nombre d'équipes incorrect");
		this.processIndex(request, response);
	    }
	}
	this.processIndex(request, response);
    }
    
    protected void processCreerTournoiEnCoursTirAuBut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	HttpSession session = request.getSession(true);
	String paramNbEquipes = (String) request.getParameter(PARAM_NB_EQUIPES);
	if (paramNbEquipes != null && paramNbEquipes.length() > 0) {
	    try {
		int nbEquipes = Integer.valueOf(paramNbEquipes);
		if (this.nombreEquipesPuissanceDe2(nbEquipes)) {
		    Peupler.creerTournoiEnCoursTirAuBut(this.facadePeupler, nbEquipes);
		    session.setAttribute(SA_SUCCESS, "Tournoi en cours avec tirs au buts créé");
		} else {
		    session.setAttribute(SA_ERROR, "Le nombre d'équipes doit être une puissance de deux");
		}
	    } catch (NumberFormatException exception) {
		session.setAttribute(SA_ERROR, "Nombre d'équipes incorrect");
		this.processIndex(request, response);
	    }
	}
	this.processIndex(request, response);
    }
    
    protected void processCreerTournoiTermine(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	HttpSession session = request.getSession(true);
	String paramNbEquipes = (String) request.getParameter(PARAM_NB_EQUIPES);
	if (paramNbEquipes != null && paramNbEquipes.length() > 0) {
	    try {
		int nbEquipes = Integer.valueOf(paramNbEquipes);
		if (this.nombreEquipesPuissanceDe2(nbEquipes)) {
		    Peupler.creerTournoiTermine(this.facadePeupler, nbEquipes);
		    session.setAttribute(SA_SUCCESS, "Tournoi terminé créé");
		} else {
		    session.setAttribute(SA_ERROR, "Le nombre d'équipes doit être une puissance de deux");
		}
	    } catch (NumberFormatException exception) {
		session.setAttribute(SA_ERROR, "Nombre d'équipes incorrect");
		this.processIndex(request, response);
	    }
	}
	this.processIndex(request, response);
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
	    throws ServletException, IOException {
	processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
	    throws ServletException, IOException {
	processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
	return "Short description";
    }// </editor-fold>

}
